﻿using System;
using System.Collections.Generic;
using System.Linq;
using Crosland.Automotriz.Entidad;
using System.Data.SqlClient;
using System.Data.EntityClient;
using System.Data;
using Crosland.Automotriz.Core;
using System.Data.Objects.SqlClient;

namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsTH_VentaDAO
    {
        private readonly DM_CROSLAND_20130417Entities ContextoDeObjs = new DM_CROSLAND_20130417Entities();
        private readonly AutomotrizEntities ContextoDeObjsA = new AutomotrizEntities();

        public List<TD_VentasCliente> Listar(int Id_Sector, int Id_Vendedor, int TipoResultado)
        {
                var p = new object[] { new SqlParameter("@Id_Sector", Id_Sector), new SqlParameter("@Id_Vendedor", Id_Vendedor) , new SqlParameter("@TIPO_RESULTADO",TipoResultado) };
                var resultado = ContextoDeObjs.ExecuteStoreQuery<TD_VentasCliente>("exec USP_List_VentasCliente @Id_Sector,@Id_Vendedor,@Tipo_Resultado", p).AsQueryable().ToList();
                return resultado;
        }

        public IEnumerable<Object> ListarClientes(string DES_CLIENTE, int filas)
        {
            var p = new object[] { new SqlParameter("@DES_CLIENTE", DES_CLIENTE) };
            var resultado = ContextoDeObjs.ExecuteStoreQuery<TD_Cliente_Listar>("exec USP_CLientes_Listar @DES_CLIENTE", p).AsQueryable().ToList().Take(filas);
            return resultado;
        }


        public IEnumerable<Object> ListarVentas(string DES_OFI_VTA, int ANIO, int MES, string NRO_FACTURA, string NRO_FOLIO, string CLIENTE, string DES_MODELO, int ID_ESTADO) 
        {
            var p = new object[] { 
                new SqlParameter("@DES_OFI_VTA", DES_OFI_VTA), 
                new SqlParameter("@ANIO", ANIO), 
                new SqlParameter("@MES", MES),
                new SqlParameter("@NRO_FACTURA",NRO_FACTURA),
                new SqlParameter("@NRO_FOLIO",NRO_FOLIO),
                new SqlParameter("@NOM_COMERCIAL",CLIENTE),
                new SqlParameter("@DES_MODELO",DES_MODELO),
                new SqlParameter("@ID_ESTADO",ID_ESTADO)
            };
            var resultado = ContextoDeObjs.ExecuteStoreQuery<MapVentaDuaTitulo>("exec USP_TH_VENTA_DUA_TITULO_LISTAR @DES_OFI_VTA,@ANIO,@MES,@NRO_FACTURA,@NRO_FOLIO,@NOM_COMERCIAL,@DES_MODELO,@ID_ESTADO", p).AsQueryable().ToList();
            return resultado;
        }

        public IEnumerable<Object> ListarVentas_Adjuntar(string DES_OFI_VTA, int ANIO, int MES, string NRO_FACTURA, string NRO_FOLIO, string CLIENTE, string DES_MODELO)
        {
            var p = new object[] { 
                new SqlParameter("@DES_OFI_VTA", DES_OFI_VTA), 
                new SqlParameter("@ANIO", ANIO), 
                new SqlParameter("@MES", MES),
                new SqlParameter("@NRO_FACTURA",NRO_FACTURA),
                new SqlParameter("@NRO_FOLIO",NRO_FOLIO),
                new SqlParameter("@NOM_COMERCIAL",CLIENTE),
                new SqlParameter("@DES_MODELO",DES_MODELO)
            };
            var resultado = ContextoDeObjs.ExecuteStoreQuery<MapVentaDuaTitulo>("exec USP_TH_VENTA_LISTAR @DES_OFI_VTA,@ANIO,@MES,@NRO_FACTURA,@NRO_FOLIO,@NOM_COMERCIAL,@DES_MODELO", p).AsQueryable().ToList();
            return resultado;
        }

        public MapVentaDuaTitulo VentasSeleccionar(int ID_ORG_VTA, int NRO_FACTURA, int NRO_POSICION)
        {
            var p = new object[] { 
                new SqlParameter("@ID_ORG_VTA", ID_ORG_VTA), 
                new SqlParameter("@NRO_FACTURA", NRO_FACTURA), 
                new SqlParameter("@NRO_POSICION", NRO_POSICION)
            };
            var resultado = ContextoDeObjs.ExecuteStoreQuery<MapVentaDuaTitulo>("exec USP_TH_VENTA_SELECCIONAR @ID_ORG_VTA,@NRO_FACTURA,@NRO_POSICION", p).AsQueryable().ToList();
            return resultado[0];
        }

        public DataTable Seleccionar() 
        {
            Crosland.Automotriz.Entidad.TH_VENTA venta = new Crosland.Automotriz.Entidad.TH_VENTA();
            var table = new DataTable();
            try
            {
                

                table.Columns.Add("ID_ORG_VTA", typeof(int));
                table.Columns.Add("ID_OFI_VTA", typeof(int));
                table.Columns.Add("NRO_FACTURA", typeof(int));

                var consulta = from c in ContextoDeObjs.TH_VENTA
                               select new
                               {
                                   c.ID_ORG_VTA,
                                   c.ID_OFI_VTA,
                                   c.NRO_FACTURA
                               };

                foreach (var myEntity in consulta.ToArray())
                {
                    var row = table.NewRow();
                    row["ID_ORG_VTA"] = myEntity.ID_ORG_VTA;
                    row["ID_OFI_VTA"] = myEntity.ID_OFI_VTA;
                    row["NRO_FACTURA"] = myEntity.NRO_FACTURA;
                    table.Rows.Add(row);
                }
                
            }
            catch (Exception)
            {
                return null;
            }
            return table;
        }

        public Crosland.Automotriz.Entidad.TH_VENTA SeleccionarVentas(int NRO_FACTURA) 
        {
            Crosland.Automotriz.Entidad.TH_VENTA venta = new Crosland.Automotriz.Entidad.TH_VENTA();
            try
            {
                var consulta = from c in ContextoDeObjs.TH_VENTA
                               where c.NRO_FACTURA == NRO_FACTURA
                               select new
                               {
                                   c.NRO_FACTURA,
                                   c.NRO_FOLIO,
                                   c.FEC_FACTURA,
                                   c.TD_CLIENTE.NOM_COMERCIAL,
                                   c.DES_MODELO,
                                   c.IMP_CANTIDAD,
                                   c.IMP_VENTA_SOLES,
                                   c.NRO_MOTOR,
                                   c.NRO_VIN,
                                   c.NRO_LOTE,
                                   c.NRO_PEDIDO_SAP,
                                   c.NRO_CAJA
                               };

                foreach (var myEntity in consulta.ToArray())
                {
                    venta.NRO_FACTURA = myEntity.NRO_FACTURA;
                    venta.NRO_FOLIO = myEntity.NRO_FOLIO;
                    venta.FEC_FACTURA = myEntity.FEC_FACTURA;
                    venta.TD_CLIENTE = new Entidad.TD_CLIENTE() { NOM_COMERCIAL = myEntity.NOM_COMERCIAL };
                    //venta.TD_CLIENTE.NOM_COMERCIAL = myEntity.NOM_COMERCIAL;
                    venta.DES_MODELO = myEntity.DES_MODELO;
                    venta.IMP_CANTIDAD = myEntity.IMP_CANTIDAD;
                    venta.IMP_VENTA_SOLES = myEntity.IMP_VENTA_SOLES;
                    venta.NRO_MOTOR = myEntity.NRO_MOTOR;
                    venta.NRO_VIN = myEntity.NRO_VIN;
                    venta.NRO_LOTE = myEntity.NRO_LOTE;
                    venta.NRO_PEDIDO_SAP = myEntity.NRO_PEDIDO_SAP;
                    venta.NRO_CAJA = myEntity.NRO_CAJA;
                }


            }
            catch (Exception)
            {
                return null;
            }
            return venta;
        }


        public IEnumerable<Object> FacturasXCliente(int idCliente, int anio, int mes, int idOfiVta,int estado)
        {
            try
            {
                IEnumerable<Object> Lista = new List<Object>();
                
                var p = new object[] { 
                new SqlParameter("@ID_CLIENTE", idCliente), 
                new SqlParameter("@ANIO", anio), 
                new SqlParameter("@MES", mes),
                new SqlParameter("@ID_OFI_VTA",idOfiVta),
                new SqlParameter("@ESTADO",estado)
                                     };

                var resultado = ContextoDeObjs.ExecuteStoreQuery<Td_FacturasXCliente>("exec USP_FACTURASXCLIENTE @ID_CLIENTE,@ANIO,@MES,@ID_OFI_VTA,@ESTADO", p).AsQueryable().ToList();
                return resultado;

                //var q = from c in ContextoDeObjsA.TH_VENTA
                //        join t in ContextoDeObjsA.TD_CLASE_FACTURA
                //        on c.COD_CLASE_FACTURA equals t.COD_CLASE_FACTURA
                //        join ti in ContextoDeObjsA.TD_TIEMPO
                //        on c.ID_TIEMPO equals ti.ID_TIEMPO
                //        join tov in ContextoDeObjsA.TD_OFICINA_VENTA
                //        on c.ID_OFI_VTA equals tov.ID_OFI_VTA
                //        where c.ES_FACTURA_ANULADA != "X" && t.IND_ESVENTA == 1
                //        && c.ID_CLIENTE == idCliente
                //        && ti.NUM_ANO == anio && ti.NUM_MES == mes
                //        && c.ID_OFI_VTA == idOfiVta
                //        group c by new
                //        {
                //            c.NRO_FACTURA,
                //            c.NRO_FOLIO,
                //            c.FEC_FACTURA,
                //            c.TIPO_MONEDA,
                //            c.ID_CLASE_FACTURA
                //        } into g
                //        orderby g.Key.FEC_FACTURA descending
                //        select new
                //        {
                //            NRO_FACTURA = (Int32?)g.Key.NRO_FACTURA,
                //            g.Key.NRO_FOLIO,
                //            FEC_FACTURA = (DateTime?)g.Key.FEC_FACTURA,
                //            g.Key.ID_CLASE_FACTURA,
                //            IMP_VENTA = g.Key.TIPO_MONEDA == "PEN" ? (System.Decimal?)g.Sum(p => p.IMP_VENTA_SOLES) : g.Key.TIPO_MONEDA == "USD" ? (System.Decimal?)g.Sum(p => p.IMP_VENTA_DOLARES) : null,
                //            SaldoFactura = g.Key.TIPO_MONEDA == "PEN" ? (System.Decimal?)g.Sum(p => p.IMP_VENTA_SOLES) : g.Key.TIPO_MONEDA == "USD" ? (System.Decimal?)g.Sum(p => p.IMP_VENTA_DOLARES) : null,
                //            Moneda = g.Key.TIPO_MONEDA == "PEN" ? "S/." : g.Key.TIPO_MONEDA == "USD" ? "$" : null,
                //            ID_MONEDA = g.Key.TIPO_MONEDA == "PEN" ? "1" : g.Key.TIPO_MONEDA == "USD" ? "2" : null
                //        };

                //Lista = q.ToList();

                //return Lista;
            }
            catch (Exception)
            {

                throw;
            }





        }

        public IEnumerable<Object> AniosFactura() 
        {
            try
            {
                IEnumerable<Object> Lista = new List<Object>();

                var consulta = (from c in ContextoDeObjs.TH_VENTA
                                select new
                                {
                                    anio = (System.Int32?)SqlFunctions.DatePart("year", c.FEC_FACTURA)
                                }).Distinct();

                Lista = consulta.ToList();

                return Lista;

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public IEnumerable<Object> ListarOficinaVenta()
        {
            IEnumerable<Object> Lista = new List<Object>();
            var q = from c in ContextoDeObjsA.TD_OFICINA_VENTA
                    select new
                    {
                        c.ID_OFI_VTA,
                        c.COD_OFI_VTA,
                        c.DES_OFI_VTA
                    };

            Lista = q.ToList();

            return Lista;
        
        }
    }
}
